package dvd;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;


import common.CBinomial;
import common.CMultinomial;
import common.CDeterminationPolarite;
import common.CMultinomialProbabiliteAPosteriori;
import common.InterfaceTest;


public class Dvd extends InterfaceTest {

	static String fichierEtiquettesPolarisees;
	static String fichierEtiquettesEstimation;
	static String fichierRenduFinal;

	public static void main(String args[]){
		
		// params multinomial
		supprimerMotsOutils = false;
		seuil = 0.001;
		epsilon = 0.9;


		listeFichiersApprentissage.add(new File ("books/training.txt") );
		listeFichiersApprentissage.add(new File("electronics/training.txt") );
		listeFichiersApprentissage.add(new File("kitchen/training.txt") );
		
		fichierEtiquettesPolarisees = "dvd/justlab.txt";
		fichierEtiquettesEstimation = "dvd/justlabEstimation.txt";
		fichierRenduFinal = "dvd/ABRIKA_DEMANGE-test-eit-11.txt";

		//determinerParamOptimauxM(true);
		//determinerParamOptimauxB(false);
		classifieurB();
		//classifieurMEtiquettesFloues();

	}

	/**
	 * Classifieur standard binomial utilisé pour estimer le corpus unlab.txt
	 */
		public static void classifieurB () {

			CBinomial classifieur = null;			

			long start = System.currentTimeMillis(); 

			PrintWriter ecrivain = null;
			try {
				ecrivain =  new PrintWriter(new BufferedWriter(new FileWriter("Binomial_training_dvd.csv")));
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			ecrivain.println("MOTS_OUTILS_SUPPRIMES;SEUIL_FREQUENCE;K;NB_MOTS_DICO_FILTRE;TAUX_REUSSITE");

			classifieur = new CBinomial	(listeFichiersApprentissage, new File("dvd/test.txt"),false,  0.001, 0.9, true, fichierRenduFinal);
			classifieur.MAJFichierCSVInfluenceSeuilFrequenceEtK(ecrivain);

			ecrivain.close();

			long time= System.currentTimeMillis(); 
			System.out.println("Programme : " + (((time - start)/1000)) + "secondes");


		}
	

/**
 * Classifieur standard multinomial
 */
	public static void classifieurM () {

		CMultinomial classifieur = null;			

		long start = System.currentTimeMillis(); 

		PrintWriter ecrivain = null;
		try {
			ecrivain =  new PrintWriter(new BufferedWriter(new FileWriter("Multinomial_training_dvd.csv")));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		ecrivain.println("MOTS_OUTILS_SUPPRIMES;SEUIL_FREQUENCE;EPSILON;NB_MOTS_DICO_FILTRE;TAUX_REUSSITE");

		classifieur = new CMultinomial	(listeFichiersApprentissage, new File("dvd/dev.txt"),supprimerMotsOutils,seuil, epsilon, false);
		classifieur.executerCreationClasseur();
		classifieur.MAJFichierCSVInfluenceSeuilFrequenceEtEpsilon(ecrivain);

		ecrivain.close();

		long time= System.currentTimeMillis(); 
		System.out.println("Programme : " + (((time - start)/1000)) + "secondes");


	}


/**
 * Utilisation des polarisation en mode semi supervisé
 */
	public static void classifieurMPolarisation() {
		
		File dvdJustlab = new File(fichierEtiquettesPolarisees);
		if (! dvdJustlab.exists())
			creerPolarite();
		
		listeFichiersApprentissage.add(dvdJustlab);		
		classifieurM();
		listeFichiersApprentissage.remove(listeFichiersApprentissage.size()-1);

	}
	
	

	/**
	 * Utilisation des etiquettes floues
	 */
	@SuppressWarnings("unused")
	public static void classifieurMEtiquettesFloues() {
		
		File dvdJustlab = new File(fichierEtiquettesEstimation);
		if (! dvdJustlab.exists()) {
			CMultinomialProbabiliteAPosteriori classfieur = new CMultinomialProbabiliteAPosteriori(listeFichiersApprentissage, new File("dvd/unlab.txt"), 
					fichierEtiquettesEstimation,supprimerMotsOutils, seuil, epsilon, false);
		}
			
		
		listeFichiersApprentissage.add(dvdJustlab);		
		classifieurM();
		listeFichiersApprentissage.remove(listeFichiersApprentissage.size()-1);

	}
	
/**
 * cree un fichier de polarites, utile pour la méthode classifieurMPolarisation
 */
	public static void creerPolarite (){

		long start = System.currentTimeMillis(); 


		// 1ère étape : on essaie de déterminer la polarité des critiques du fichier
		// "unlab.txt", avec comme jeu d'apprentissage "training.txt"
		// Ceci va avoir pour effet de créér un fichier "justlab.txt", contenant
		// exactement toutes les critiques de "unlab.txt", mais étiquetées

		PrintWriter ecrivain = null;
		try {
			ecrivain =  new PrintWriter(new BufferedWriter(new FileWriter("Ddv_q2.csv")));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		ecrivain.println("Itération;TauxReussite");

		CDeterminationPolarite m = new CDeterminationPolarite
		(listeFichiersApprentissage, new File("dvd/unlab.txt"),fichierEtiquettesPolarisees, true,0.001,12.0);
		m.executerCreationClasseur();

		ecrivain.close();

		long time= System.currentTimeMillis(); 
		System.out.println("Creation de : "+fichierEtiquettesPolarisees +" a pris " + (((time - start)/1000)) + "secondes");

	}



	public static void determinerParamOptimauxM(boolean avecEtiquettesFloues){

		CMultinomial classifieur = null;	
		double seuiCourantl, epsilonCourant;
		double meilleurTaux = -1, meilleurSeuil=-1, meilleurEpsilon=-1;
		String resultat_final = "Meilleur taux = "+meilleurTaux+" meilleur seuil = "+meilleurSeuil+"meilleur epsilon ="+meilleurEpsilon;
		if (avecEtiquettesFloues)
			listeFichiersApprentissage.add(new File(fichierEtiquettesEstimation));		


		long start = System.currentTimeMillis(); 

		PrintWriter ecrivain = null;
		try {
			ecrivain =  new PrintWriter(new BufferedWriter(new FileWriter("Determination_meilleur_param_dvd_flou.csv")));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		ecrivain.println("MOTS_OUTILS_SUPPRIMES;SEUIL_FREQUENCE;EPSILON;NB_MOTS_DICO_FILTRE;TAUX_REUSSITE");


		// détermination des meilleurs paramètres
		for (seuiCourantl=0.005; seuiCourantl < 0.01; seuiCourantl+= 0.001) {
			for (epsilonCourant = 15; epsilonCourant < 22; epsilonCourant += 0.2){
				classifieur = new CMultinomial	(listeFichiersApprentissage, new File("dvd/dev.txt"),false,seuiCourantl, epsilonCourant, false);
				classifieur.executerCreationClasseur();
				classifieur.MAJFichierCSVInfluenceSeuilFrequenceEtEpsilon(ecrivain);
				System.out.println("classifieur.get taux réussite ="+classifieur.getTauxReussite());
				if (classifieur.getTauxReussite() > meilleurTaux){
					meilleurTaux = classifieur.getTauxReussite();
					meilleurSeuil = seuiCourantl;
					meilleurEpsilon = epsilonCourant;
					//System.out.println(resultat_final);
				}
			}
			System.out.println(resultat_final);
		}

		//classifieur.MAJFichierCSVInfluenceSeuilFrequenceEtEpsilon(ecrivain);
		ecrivain.close();

		long time= System.currentTimeMillis(); 
		System.out.println("Programme : " + (((time - start)/1000)) + "secondes");
		
		System.out.println(resultat_final);
		ecrivain.write(resultat_final);
		if (avecEtiquettesFloues)
			listeFichiersApprentissage.remove(listeFichiersApprentissage.size()-1);

	}
	
	public static void determinerParamOptimauxB(boolean avecEtiquettesFloues) {
		CBinomial classifieur = null;	
		double seuiCourantl, KCourant;
		double meilleurTaux = -1, meilleurSeuil=-1, meilleurEpsilon=-1;
		String resultat_final = "Meilleur taux = "+meilleurTaux+" meilleur seuil = "+meilleurSeuil+"meilleur epsilon ="+meilleurEpsilon;
		if (avecEtiquettesFloues)
			listeFichiersApprentissage.add(new File(fichierEtiquettesEstimation));		


		long start = System.currentTimeMillis(); 

		PrintWriter ecrivain = null;
		try {
			ecrivain =  new PrintWriter(new BufferedWriter(new FileWriter("Determination_meilleur_param_dvd_flou.csv")));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		ecrivain.println("MOTS_OUTILS_SUPPRIMES;SEUIL_FREQUENCE;EPSILON;NB_MOTS_DICO_FILTRE;TAUX_REUSSITE");


		// détermination des meilleurs paramètres
		for (seuiCourantl=0.001; seuiCourantl < 0.0012; seuiCourantl+= 0.001) {
			for (KCourant = 0.8; KCourant < 1; KCourant += 0.01){
				classifieur = new CBinomial	(listeFichiersApprentissage, new File("dvd/dev.txt"),false,seuiCourantl, KCourant, false, null);
				
				classifieur.MAJFichierCSVInfluenceSeuilFrequenceEtK(ecrivain);
				//System.out.println("classifieur.get taux réussite ="+classifieur.getTauxReussite());
				if (classifieur.getTauxReussite() > meilleurTaux){
					meilleurTaux = classifieur.getTauxReussite();
					meilleurSeuil = seuiCourantl;
					meilleurEpsilon = KCourant;
					//System.out.println(resultat_final);
				}
			}
			//System.out.println(resultat_final);
		}

		//classifieur.MAJFichierCSVInfluenceSeuilFrequenceEtEpsilon(ecrivain);
		ecrivain.close();

		long time= System.currentTimeMillis(); 
		System.out.println("Programme : " + (((time - start)/1000)) + "secondes");
		
		System.out.println(resultat_final);
		ecrivain.write(resultat_final);
		if (avecEtiquettesFloues)
			listeFichiersApprentissage.remove(listeFichiersApprentissage.size()-1);
		
	}


}
